// Package util util/crc32.go
// util 包提供通用工具函数，例如 CRC32 计算。
package util

import (
	"hash/crc32"
	// 引入 format 包以使用 FormatForCRC, NULL_PLACEHOLDER, KEY_PART_SEPARATOR
)

// crc32Table IEEE 多项式表，确保全局一致
var crc32Table = crc32.MakeTable(crc32.IEEE)

// CalculateRowCRC32 计算单行数据的 CRC32。
// 它接收已经具有正确 Go 类型的值列表。
// values: 按照列顺序排列的值 (已经是正确的 Go 类型)。
// separator: 列之间的分隔符 (用于写入 hasher)。
// nullPlaceholder: **不再使用**，由 util.FormatForCRC 处理 NULL。
// 返回值: uint32 CRC校验和。
func CalculateRowCRC32(values []interface{}, separator string) uint32 { // 移除 nullPlaceholder 参数
	// 使用 hash/crc32 的 Hash 接口进行增量计算
	hasher := crc32.New(crc32Table)
	sepBytes := []byte(separator) // 分隔符字节

	for i, val := range values {
		// 使用 util 包中导出的 FormatForCRC 将 Go 值转换为用于 CRC 计算的字节切片
		bytesToWrite := FormatForCRC(val) // 调用移至 util/format.go 的函数

		// 写入格式化后的字节
		_, _ = hasher.Write(bytesToWrite) // Write 在 hash.Hash 上保证不返回错误

		// 在列之间写入分隔符
		if i < len(values)-1 {
			_, _ = hasher.Write(sepBytes)
		}
	}
	// 返回最终的 CRC32 校验和
	return hasher.Sum32()
}
